# 1. 集合
## 基本格式: 集合名 = {元素1,元素2,元素3...}
s1 = {1,3,54,674}
print(s1,type(s1)) #{1, 674, 3, 54} <class 'set'>
s1 = {}
print(type(s1)) # 是字典! # <class 'dict'>

s1 = set()
print(type(s1)) # <class 'set'>

## 集合是无序的
s1 = {'a','b','c','d','e','f','g'}
print(s1) # {'f', 'a', 'c', 'd', 'b', 'e', 'g'} 并且每次运行的结果都不一致


s2 = {1,2,3,4,5,6,7,8,9}
print(s2) # {1, 2, 3, 4, 5, 6, 7, 8, 9} 都是一样的

# 原理 :集合无序的实现方式涉及哈希表
print(hash('a'))
print(hash('b'))
print(hash('c'))
# -1021943667961903170
# 124287906738103109
# 2267474407407216756  但是每次运行的结果不一致

print(hash(1))
print(hash(2))
print(hash(3))
# 1
# 2
# 3 每次都是一样的
#本质上是因为py中int整型的哈希值就是他本身,在哈希表中的位置不会发生改变


# 利用无序性 就不能修改集合中的值

#2. 集合的唯一性
s1 = {1,2,3,1,2,3}
print(s1) # {1, 2, 3}

# 3. 常见操作 由于无序,不能进行查询
## 添加元素
### add 一次只能添加一个元素
s1 = {1,2,3}
s1.add(4)
print(s1) # {1, 2, 3, 4}
s1.add(1)
print(s1) # {1, 2, 3, 4}
s1.add((1,2,3,4))
print(s1) # {1, 2, 3, 4, (1, 2, 3, 4)}

### update 把传入的元素拆分,一个个放进集合中
s1 = {1,2,3,4}
s1.update("12345")
print(s1)#{1, 2, 3, 4, '4', '1', '5', '2', '3'}
s1.update([1,2,3,4,5])
print(s1) # {1, 2, 3, 4, 5, '4', '1', '5', '2', '3'}


## 删除元素
### remove -> 选择删除的元素,如果集合中有就删除,没有就会报错
s1 = {1,2,3,4,5}
s1.remove(5)
print(s1) # {1, 2, 3, 4}

### pop -> 删除根据哈希表排序后的第一个元素
s1 = {1,2,3,4,5}
s1.pop()
print(s1) # {2, 3, 4, 5}

### discard 选择要删除的元素,存在则删除,不存在不进行任何操作
s1 = {1,2,3,4,5}
s1.discard(1)
print(s1) # {2, 3, 4, 5}
s1.discard(6)
print(s1) # {2, 3, 4, 5}


## 交集和并集
s1 = {1,2,3,4}
s2 = {2,3,4,5}
s3 = {6,6,6,6}
### 交集 &

print(s1 & s2) # {2,3,4}
print(s1 & s3) # set()

### 并集
print(s1 | s2 | s3) # {1, 2, 3, 4, 5, 6}